/**找出 nums 中连续、非空且其中最大元素在范围 [left, right] 内的子数组
 * @param {number[]} nums
 * @param {number} left
 * @param {number} right
 * @return {number}
 */
var numSubarrayBoundedMax = function (nums, left, right) {
    // last1表示上一次出现left和right之间的数的位置 不存在则为-1
    // last2表示上一次出现超过right的数的位置 不存在则为-1
    let res = 0, last2 = -1, last1 = -1;

    for (let i = 0; i < nums.length; i++) {

        if (nums[i] >= left && nums[i] <= right) {
            last1 = i;
        } else if (nums[i] > right) {
            last2 = i;
            last1 = -1;
        }

        // 某子数组以i为右端点，合法的左端点区间为 (last2,last1]
        // 从上一次超过right的数的位置开始，一直到最近的 left和right之间的数
        // 当前数如果不是last1是因为比left小 
        // 比left小不能是合法的左端点，否则会导致区间最大数都小于left
        if (last1 !== -1) {
            res += last1 - last2;
        }
    }

    return res;
};

// 暴力法
var numSubarrayBoundedMax = function (nums, left, right) {
    const res = []
    
    // 找出所有连续子数组
    for (let i = 0; i < nums.length; i++) {
        if (nums[i] > right) {
            continue
        }
        let curr = [nums[i]]
        res.push([...curr])
        for (let j = i + 1; j < nums.length; j++) {
            if (nums[j] > right) {
                break
            }
            curr.push(nums[j])
            res.push([...curr])
        }
    }

    // 找出所有子数组中最大值为符合条件的
    let result = res.filter(item => {
        let temp = Math.max(...item)
        return temp <= right && temp >= left
    })

    return result.length
};